home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / os2 / plnk081.zip / pilot-link.0.8.1 / libcc / appInfo.cc < prev    next >
C/C++ Source or Header  |  1997-05-23  |  3KB  |  108 lines

  1.  
  2. #include "pi-source.h"
  3. #include "pi-appinfo.hxx"
  4.  
  5. // Constructor for an app info has to determine the base appinfo fields
  6. appInfo_t::appInfo_t(const void *ap) 
  7. {
  8.      _renamedCategories = get_short(ap);
  9.  
  10.      unsigned char *ptr = ((unsigned char *) ap) + 2;
  11.      
  12.      (void) memcpy(_categoryName, ptr, 256);
  13.      ptr += 256;
  14.  
  15.      (void) memcpy(_categoryID, ptr, 16);
  16.  
  17.      ptr += 16;
  18.      _lastUniqueID = get_byte(ptr);
  19. }
  20.  
  21. // Given an integer location, we return the category name, or NULL if not found
  22. char *appInfo_t::category(const int idx)
  23. {
  24.      if (idx < 0 || idx > 15)
  25.       return NULL;
  26.  
  27.      return _categoryName[idx];
  28. }
  29.  
  30. // Given a category name, we return it's integer location, or -1 if not found
  31. int appInfo_t::categoryIndex(charConst_t category) const 
  32. {
  33.      for (short int i = 0; i < 16; i++)
  34.       if (!strcmp(_categoryName[i], category))
  35.            return i;
  36.  
  37.      return -1;
  38. }
  39.  
  40. // Given a new category name, we add it to the local info.  This does NOT
  41. // modify the info on the pilot.  To actually change the data on the pilot
  42. // you need to pack this application info and then load it to the pilot
  43. // If false is returned, there are already 16 categories defined
  44.  
  45. int appInfo_t::addCategory(charConst_t category)
  46. {
  47.      for (short int i = 0; i < 16; i++)
  48.       if (_categoryName[i][0] == '\0') {
  49.            // We found a free slot
  50.            (void) strcpy(_categoryName[i], category);
  51.  
  52.            // Now find an ID to use.  We are allowed between 128 & 255,
  53.            short int j;
  54.            unsigned char id = 128;
  55.            for (j = 0; j < 16; j++)
  56.             if (_categoryName[i][0] != '\0' && _categoryID[j] > id)
  57.              id = _categoryID[j];
  58.  
  59.            if (++id == 256) {
  60.             id = 127;
  61.  
  62.             do {
  63.              id++;
  64.              for (j = 0; j < 16; j++)
  65.                   if (_categoryName[i][0] != '\0' &&
  66.                   _categoryID[j] == id)
  67.                    break;
  68.             } while (j != 16);
  69.            }
  70.  
  71.            _categoryID[i] = id;
  72.            
  73.            return 1;
  74.       }
  75.  
  76.      return 0;
  77. }
  78.  
  79. // Given an existing category name, we remove it from the local info.  This
  80. // does not modify the info on the pilot.  See comments on addCategory().
  81. // Returns true if the category was removed, false if it was not found
  82. int appInfo_t::removeCategory(charConst_t category) 
  83. {
  84.      for (short int i = 0; i < 16; i++)
  85.       if (!strcmp(_categoryName[i], category)) {
  86.            // We found their category
  87.            _categoryName[i][0] = '\0';
  88.            return 1;
  89.       }
  90.  
  91.      return 0;
  92. }
  93.  
  94. void appInfo_t::baseAppInfoPack(unsigned char *buffer) 
  95. {
  96.      set_short(buffer, _renamedCategories);
  97.  
  98.      unsigned char *ptr = ((unsigned char *) buffer) + 2;
  99.  
  100.      (void) memcpy(ptr, _categoryName, 256);
  101.      ptr += 256;
  102.  
  103.      (void) memcpy(ptr, _categoryID, 16);
  104.  
  105.      ptr += 16;
  106.      set_byte(ptr, _lastUniqueID);
  107. }
  108.